/**
 * 数采配置模块
 * @description 定义数采的配置项数组，包括工序名称、机组名称、IO、参数名称、参数值
 * @author 刘璐新
 * @date 2025-01-12
 */

// 导入API方法
import request from "@/utils/request";

// 数采API配置
const DAS_API_CONFIG = {
  //办公环境数采地址
  // baseUrl: "http://10.76.83.68:8182/scada/v1/ua/datapoint/current/rtdb/access",
  // 工业环境数采地址
  baseUrl: "http://172.168.1.10:8182/scada/v1/ua/datapoint/current/rtdb/access",
  method: "POST",
  // 测试模式开关
  enableTestMode: false,
};

/**
 * 测试mock数据
 */
const TEST_MOCK_DATA = {
  code: 0,
  result: [
    {
      v: -926.5,
      s: 1,
      t: 1763456678043,
      nodeid: "ns=110;s=sxdzc2.PV",
    },
  ],
  msg: "success",
};

/**
 * 获取数采数据（真正的API调用）
 * @param {Array} nodes - 参数值数组
 * @returns {Promise} 返回数采数据请求Promise
 */
function postDasKey(nodes) {
  console.log("nodes:", nodes);

  // 测试模式：返回mock数据
  if (DAS_API_CONFIG.enableTestMode) {
    console.log("[测试模式] 使用mock数据", TEST_MOCK_DATA);
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve(TEST_MOCK_DATA);
      }, 500); // 模拟网络延迟
    });
  }

  return new Promise((resolve, reject) => {
    uni.request({
      url: DAS_API_CONFIG.baseUrl,
      method: DAS_API_CONFIG.method,
      data: {
        nodes: nodes,
      },

      success: (res) => {
        console.log("result:", res);
        if (res.code === 0) {
          resolve(res);
        } else {
          reject(new Error(`请求失败: ${res.statusCode}`));
        }
      },
      fail: (err) => {
        reject(new Error(`网络请求失败: ${err.errMsg}`));
      },
    });
  });
}

/**
 * 获取数采配置项（通过字典API动态获取）
 * @param {Object} params - 查询参数
 * @returns {Promise} 返回数采配置项数组Promise
 */
async function getDasConfigList(parameterName) {
  try {
    const defaultParams = {
      pageNo: 1,
      pageSize: 100,
      dictType: "das", // 使用meas_das字典类型
      label: parameterName,
    };
    const response = await request({
      url: "/system/dict-data/page",
      method: "get",
      params: defaultParams,
    });

    if (response.code === 0) {
      // 将返回的数据转换为数采配置格式
      // label -> 工序名称(processName)
      // value -> 参数值(parameterValue)
      // remark -> 备注信息，可用于parameterName
      return (response.data.list || []).map((item) => ({
        parameterName: item.label || "", // 参数名称，优先使用remark，其次使用label
        parameterValue: item.value || "", // 参数值
      }));
    } else {
      throw new Error(response.msg || "获取数采配置失败");
    }
  } catch (error) {
    console.error("获取数采配置失败:", error);
    throw error;
  }
}

/**
 * 外部获取数采方法 - 通过工序名称、机组名称、IO、参数名称获取数组内的参数值
 * @param {string} processName - 工序名称
 * @param {string} unitName - 机组名称
 * @param {string} ioType - IO类型
 * @param {string} parameterName - 参数名称
 * @returns {string|null} 返回对应的参数值，如果找不到返回null
 */
async function getDasKey(parameterName) {
  try {
    // 动态获取数采配置项
    const configList = await getDasConfigList(parameterName);

    // 在配置数组中查找匹配的配置项
    const configItem = configList.find(
      (item) => item.parameterName === parameterName
    );

    // 如果找到数据，则调用数采API获取数据
    if (configItem) {
      return postDasKey([configItem.parameterValue]);
    } else {
      return null;
    }
  } catch (error) {
    console.error("获取数采key失败:", error);
    return null;
  }
}

// 导出配置和方法
export { postDasKey, getDasKey, getDasConfigList };
